gdk: Add gdk_seat_get_tools() API call
authorCarlos Garnacho <carlosg@gnome.org>
Tue, 28 Jul 2020 14:51:41 +0000 (16:51 +0200)
committerCarlos Garnacho <carlosg@gnome.org>
Tue, 28 Jul 2020 22:11:34 +0000 (00:11 +0200)
There's GdkSeat::tool-added and ::tool-removed, but there's no
API to query the known tools. Add this call.

docs/reference/gdk/gdk4-sections.txt
gdk/gdkseat.c
gdk/gdkseat.h
gdk/gdkseatdefault.c
gdk/gdkseatprivate.h
gdk/wayland/gdkdevice-wayland.c

index 7e142c3310bbd28e7fc168c05813b615527b1f4a..a863bae8576f0f261739c0c35f0b851fd07efba4 100644 (file)
@@ -439,6 +439,7 @@ gdk_seat_get_capabilities
 gdk_seat_get_pointer
 gdk_seat_get_keyboard
 gdk_seat_get_physical_devices
+gdk_seat_get_tools
 
 <SUBSECTION Standard>
 GDK_SEAT
index 6505169c33f84cda139d8ddad795fb6d7b01b3e9..8b6a88997c9e08beec52121a1a22f4e0587c23f2 100644 (file)
@@ -22,6 +22,7 @@
 #include <glib-object.h>
 #include "gdkdisplay.h"
 #include "gdkdevice.h"
+#include "gdkdevicetoolprivate.h"
 #include "gdkseatprivate.h"
 #include "gdkdeviceprivate.h"
 #include "gdkintl.h"
@@ -438,11 +439,45 @@ GdkDeviceTool *
 gdk_seat_get_tool (GdkSeat *seat,
                    guint64  serial,
                    guint64  hw_id)
+{
+  GdkDeviceTool *match = NULL;
+  GList *tools, *l;
+
+  tools = gdk_seat_get_tools (seat);
+
+  for (l = tools; l; l = l->next)
+    {
+      GdkDeviceTool *tool = l->data;
+
+      if (tool->serial == serial && tool->hw_id == hw_id)
+        {
+          match = tool;
+          break;
+        }
+    }
+
+  g_list_free (tools);
+
+  return match;
+}
+
+/**
+ * gdk_seat_get_tools:
+ * @seat: A #GdkSeat
+ *
+ * Returns all #GdkDeviceTool<!-- -->s that are known to the
+ * application.
+ *
+ * Returns: (transfer container) (element-type Gdk.DeviceTool): A list of tools. Free with
+ * g_list_free().
+ **/
+GList *
+gdk_seat_get_tools (GdkSeat *seat)
 {
   GdkSeatClass *seat_class;
 
   g_return_val_if_fail (GDK_IS_SEAT (seat), NULL);
 
   seat_class = GDK_SEAT_GET_CLASS (seat);
-  return seat_class->get_tool (seat, serial, hw_id);
+  return seat_class->get_tools (seat);
 }
index 960a6e306bbf698d56ca8dde89651d6ba93511b3..1802d5348fd86b665e4cb29a346a2725998662f3 100644 (file)
@@ -78,6 +78,8 @@ GDK_AVAILABLE_IN_ALL
 GList *        gdk_seat_get_physical_devices    (GdkSeat             *seat,
                                                  GdkSeatCapabilities  capabilities);
 
+GList *        gdk_seat_get_tools               (GdkSeat *seat);
+
 GDK_AVAILABLE_IN_ALL
 GdkDevice *    gdk_seat_get_pointer             (GdkSeat             *seat);
 GDK_AVAILABLE_IN_ALL
index bf7537ef5a8a745927c71fda6d54eb1727dbe3a8..dd44233a6baf1b98fdd875e84350bbeb0d8c83c9 100644 (file)
@@ -279,13 +279,12 @@ gdk_seat_default_get_physical_devices (GdkSeat             *seat,
   return devices;
 }
 
-static GdkDeviceTool *
-gdk_seat_default_get_tool (GdkSeat *seat,
-                           guint64  serial,
-                           guint64  hw_id)
+static GList *
+gdk_seat_default_get_tools (GdkSeat *seat)
 {
   GdkSeatDefaultPrivate *priv;
   GdkDeviceTool *tool;
+  GList *tools = NULL;
   guint i;
 
   priv = gdk_seat_default_get_instance_private (GDK_SEAT_DEFAULT (seat));
@@ -296,12 +295,10 @@ gdk_seat_default_get_tool (GdkSeat *seat,
   for (i = 0; i < priv->tools->len; i++)
     {
       tool = g_ptr_array_index (priv->tools, i);
-
-      if (tool->serial == serial && tool->hw_id == hw_id)
-        return tool;
+      tools = g_list_prepend (tools, tool);
     }
 
-  return NULL;
+  return tools;
 }
 
 static void
@@ -319,8 +316,7 @@ gdk_seat_default_class_init (GdkSeatDefaultClass *klass)
 
   seat_class->get_logical_device = gdk_seat_default_get_logical_device;
   seat_class->get_physical_devices = gdk_seat_default_get_physical_devices;
-
-  seat_class->get_tool = gdk_seat_default_get_tool;
+  seat_class->get_tools = gdk_seat_default_get_tools;
 }
 
 static void
index 07672f6a445723d33b21626edb11e91a9e84dcfb..90e8a8674ca0c4d4734b2e44b28f0afa477bc99a 100644 (file)
@@ -57,9 +57,7 @@ struct _GdkSeatClass
   GList *     (* get_physical_devices) (GdkSeat             *seat,
                                         GdkSeatCapabilities  capabilities);
 
-  GdkDeviceTool * (* get_tool) (GdkSeat *seat,
-                                guint64  serial,
-                                guint64  tool_id);
+  GList * (* get_tools) (GdkSeat *seat);
 };
 
 void gdk_seat_device_added   (GdkSeat   *seat,
index 8096782ad0bad45569ef6130967195b66c36d3e1..d9a9a956728374321947fdc8df909b080df2c189 100644 (file)
@@ -4749,6 +4749,22 @@ gdk_wayland_seat_get_physical_devices (GdkSeat             *seat,
   return physical_devices;
 }
 
+static GList *
+gdk_wayland_seat_get_tools (GdkSeat *seat)
+{
+  GdkWaylandSeat *wayland_seat = GDK_WAYLAND_SEAT (seat);
+  GList *tools = NULL, *l;
+
+  for (l = wayland_seat->tablet_tools; l; l = l->next)
+    {
+      GdkWaylandTabletToolData *tool = l->data;
+
+      tools = g_list_prepend (tools, tool->tool);
+    }
+
+  return tools;
+}
+
 static void
 gdk_wayland_seat_class_init (GdkWaylandSeatClass *klass)
 {
@@ -4762,6 +4778,7 @@ gdk_wayland_seat_class_init (GdkWaylandSeatClass *klass)
   seat_class->ungrab = gdk_wayland_seat_ungrab;
   seat_class->get_logical_device = gdk_wayland_seat_get_logical_device;
   seat_class->get_physical_devices = gdk_wayland_seat_get_physical_devices;
+  seat_class->get_tools = gdk_wayland_seat_get_tools;
 }
 
 static void